package database

import (
	"Short_chain_cats/config"
	"context"
	"fmt"
	"log"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
)

var (
	connPool = make(map[string]*gorm.DB)
)

// NewOrm 默认返回default数据库连接
func NewOrm(ctx context.Context, dbName ...string) *gorm.DB {
	conn := connPool["default"]
	if len(dbName) > 0 {
		if cn, ok := connPool[dbName[0]]; ok {
			conn = cn
		}
	}
	return conn.WithContext(ctx)
}

//// Init 初始化数据库连接
//func Init(cfg *config.MySQLConfig) error {
//	sections := cfg.Section("db").ChildSections()
//	for _, v := range sections {
//		var (
//			name        = strings.TrimPrefix(v.Name(), "db.")
//			dsn         = v.Key("dsn").String()
//			maxIdleConn = v.Key("max_idle_conn").MustInt(10)
//			maxOpenConn = v.Key("max_open_conn").MustInt(30)
//		)
//		conn, err := openConn(dsn, maxIdleConn, maxOpenConn)
//		if err != nil {
//			return fmt.Errorf("open db conn failed, error: %s", err.Error())
//		}
//		connPool[name] = conn
//	}
//	return nil
//}

// Init 初始化数据库连接
func Init(cfg *config.MySQLConfig) error {
	// 使用配置创建 DSN
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
		cfg.User, cfg.Password, cfg.Host, cfg.Port, cfg.DBName)

	maxIdleConn := cfg.MaxIdleConn // 默认值，可以从配置文件中读取
	maxOpenConn := cfg.MaxOpenConn // 默认值，可以从配置文件中读取

	conn, err := openConn(dsn, maxIdleConn, maxOpenConn) // 需要定义 openConn 函数
	if err != nil {
		return fmt.Errorf("open db conn failed, error: %s", err.Error())
	}
	connPool["default"] = conn
	return nil
}

func openConn(dsn string, idle, open int) (*gorm.DB, error) {
	// 设置 GORM 的日志配置
	newLogger := logger.New(
		log.New(log.Writer(), "\r\n", log.LstdFlags), // 使用标准日志输出
		logger.Config{
			LogLevel: logger.Info, // 设置日志级别
		},
	)
	// 初始化 GORM 数据库连接
	openDB, err := gorm.Open(mysql.New(mysql.Config{DSN: dsn}), &gorm.Config{Logger: newLogger})
	if err != nil {
		return nil, err
	}
	// 获取原生数据库连接
	db, err := openDB.DB()
	if err != nil {
		return nil, err
	}
	// 配置连接池
	db.SetMaxIdleConns(idle)
	db.SetMaxOpenConns(open)
	// 返回 GORM 的数据库对象
	return openDB, nil
}
